home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / otohime / src / lib / delay.asm next >
Assembly Source File  |  1994-06-01  |  10KB  |  412 lines

  1. ;            PCM SOUND DELAY
  2. ;
  3. ;        call from F-BASIC386 or High C
  4. ;    callm address,varptr(sndata),varptr(param),varptr(workarea)
  5. ;    void  DELAY(*snddata,*param,*workarea)
  6. ;
  7. ;
  8. ;            1990 3  Hiroshi TODA
  9. ;
  10. ;            1993 12 High C 用に改造
  11. ;
  12. ;    param:del,mix1,mix2,md1,sp1,ang1,nd2,sp2,ang2
  13. ;    work area = 256Byte
  14. ;
  15.  
  16.     .386p
  17.  
  18.  
  19. param    struc
  20.  
  21.     dd    ?
  22.     dd    ?
  23. sndadd    dd    ?        ; snd.data address
  24. paradd    dd    ?        ; para. address
  25. wadd    dd    ?         ; work address
  26.  
  27. param   ends
  28.  
  29.  
  30. work    struc
  31.  
  32. ;data area
  33.  
  34. del    dd    ?        ; delay Bite
  35. mix1    dd    ?        ; main mix rate
  36. mix2    dd    ?        ; delay mix rate
  37. md1    dd    ?        ; modulation1
  38. sp1    dd    ?        ; speed1 (90 = 10000H)
  39. ang1    dd    ?        ; angle1
  40. md2    dd    ?        ; modulation2
  41. sp2    dd    ?        ; speed2 (90 = 10000H)
  42. ang2    dd    ?        ; angle2
  43.  
  44. ;work area
  45.  
  46. point1    dd    ?        ; ov.sampling point (decimal)
  47. point2    dd    ?        ; ov.sampling point (integer)
  48. buf1    dd    ?        ; sampling add buf.
  49.  
  50. ;    これ以下 1995 1 に追加
  51. sourceStart    dd    ?        ; source data の 開始アドレス
  52. sourceEnd    dd    ?        ; source data の 終了アドレス
  53.  
  54. work    ends
  55.  
  56.  
  57. cseg    segment    dword public use32 'CODE'
  58.     assume    cs:cseg,ds:cseg
  59.  
  60.     public    sndDelay
  61.     db    'sndDelay',8
  62. sndDelay    proc    near
  63.     push    ebp
  64.     mov    ebp,esp
  65.     push    esi
  66.     push    edi
  67.     push    ebx
  68.  
  69.     mov    esi,[ebp].wadd        ; esi <-- work area top add
  70.     mov    edi,[ebp].sndadd    ; edi <-- snd.data add.
  71.     mov    ecx,[ebp].paradd    ; ecx <-- para. add.
  72.     xor    edx,edx            ; edx=count
  73. main01:    mov    eax,[ecx][edx*4]    ; para. --> work area
  74.     mov    [esi][edx*4],eax
  75.     inc    edx
  76.     cmp    edx,9
  77.     jb    main01
  78.  
  79.     mov    edx,edi
  80.     add    edx,32
  81.     mov    [esi].sourceStart,edx    ; sourceStart = source start address
  82.     add    edx,[edi+12]
  83.     mov    [esi].sourceEnd,edx        ; sourceEnd = source end address
  84.  
  85.     mov    ecx,[edi+12]        ; length
  86. ;    sub    ecx,[esi].del
  87.     cmp    ecx,0
  88.     je    mainE
  89. ;    jbe    mainE                ; jb を jbe に変更 1993 12
  90.     add    edi,32
  91.  
  92. main02:
  93.     mov    eax,edi
  94.     sub    eax,[esi].del        ; eax = delay point
  95.     mov    [esi].point2,eax    ; ov.sampling point cal.
  96.     xor    eax,eax
  97.     mov    [esi].point1,eax
  98.  
  99.     mov    eax,[esi].ang1        ; phase shift cal.
  100.     call    sin            ; eax = sin(eax)*10000H
  101.     imul    dword ptr [esi].md1
  102.     mov    [esi].buf1,eax
  103.     mov    eax,[esi].ang2
  104.     call    sin            ; eax = sin(eax)*10000H
  105.     imul    dword ptr [esi].md2
  106.     add    eax,[esi].buf1
  107.     cdq
  108.     add    [esi].point1+2,eax
  109.     adc    word ptr [esi].point2+2,dx
  110.  
  111.     mov    eax,[esi].point2    ; source start~end check
  112.     cmp    eax,[esi].sourceEnd
  113.     jae    main021
  114.     cmp    eax,[esi].sourceStart
  115.     jae    main03
  116. main021:
  117.     xor    eax,eax
  118.     jmp    main04
  119. main03:
  120.     lea    eax,[esi].point1    ; over sampling
  121.     call    smp
  122. main04:
  123.     imul    eax,[esi].mix2        ; mix
  124.     mov    [esi].buf1,eax
  125.  
  126. ;    mov    ebx,[esi].del
  127. ;    mov    al,[edi][ebx]
  128.     mov al,[edi]
  129.     and    eax,0ffH
  130.     cmp    eax,128
  131.     jb    main05
  132.     mov    edx,eax
  133.     mov    eax,128
  134.     sub    eax,edx
  135. main05:
  136.     imul eax,[esi].mix1
  137.     add    eax,[esi].buf1
  138.     sar    eax,8
  139.     js    main07            ; eax --> pcm data
  140.     je    main07
  141.     cmp    eax,128            ; +
  142.     jb    main08
  143.     mov    eax,127
  144.     jmp    main08
  145. main07:    mov    edx,eax            ; -
  146.     mov    eax,128
  147.     sub    eax,edx
  148.     cmp    eax,256-1    ; data255はloopStopの意味があるから除外 1993 12
  149.     jb    main08
  150.     mov    eax,255-1    ; data255はloopStopの意味があるから除外 1993 12
  151. main08:
  152. ;    mov    [edi][ebx],al
  153.     mov    [edi],al
  154.  
  155.     mov    eax,[esi].sp1
  156.     add    [esi].ang1,eax
  157.     mov    eax,[esi].sp2
  158.     add    [esi].ang2,eax
  159.     inc    edi
  160.     dec    ecx
  161.     jne    main02
  162.  
  163. mainE:
  164.     pop    ebx
  165.     pop    edi
  166.     pop    esi
  167.     mov    esp,ebp
  168.     pop    ebp
  169.     ret
  170.  
  171. ;    OVER SAMPLING for PCM DATA(8bit)
  172. ;input    eax = 64bit(32bit/decimal,32bit/integer) data address(ds:)
  173. ;output    eax = over sampring data ( 32bit sign (-128 -- +127) )
  174.  
  175. smp:    push    ebx
  176.     push    ecx
  177.     push    edx
  178.     push    esi
  179.     push    edi
  180.     mov    ebx,[eax]        ; ebx = decimal
  181.     mov    esi,[eax+4]        ; esi = integer
  182.     shr    ebx,24            ; ebx --> 8bit
  183.     jne    smp00
  184.  
  185.     mov    al,[esi]        ; decimal=0
  186.     and    eax,0ffH
  187.     cmp    eax,128
  188.     jb    smp0A
  189.     mov    edx,eax
  190.     mov    eax,128
  191.     sub    eax,edx
  192. smp0A:    jmp    smp06
  193.  
  194. smp00:
  195.     mov    eax,[esi-1]        ; 周囲がみな無信号ならノイズを出さないよう直接0を返す
  196.     cmp    eax,80808080h
  197.     jne    smp0B
  198.     xor    eax,eax
  199.     jmp    smp06
  200.  
  201. smp0B:
  202.     call    smp01
  203. smp01:    pop    edi
  204.     add    edi,smptb-smp01        ; edi = table point
  205.  
  206.     mov    al,[esi]
  207.     and    eax,0ffH
  208.     cmp    eax,128
  209.     jb    smp02
  210.     mov    edx,eax
  211.     mov    eax,128
  212.     sub    eax,edx
  213. smp02:    add    eax,128
  214.     mul    byte ptr cs:[edi][ebx]
  215.     mov    ecx,eax
  216.  
  217.     mov    al,[esi-1]
  218.     and    eax,0ffH
  219.     cmp    eax,128
  220.     jb    smp03
  221.     mov    edx,eax
  222.     mov    eax,128
  223.     sub    eax,edx
  224. smp03:    add    eax,128
  225.     mul    byte ptr cs:[edi][ebx+256]
  226.     sub    ecx,eax
  227.  
  228.     mov    eax,ebx            ; ebx = 256 - ebx
  229.     mov    ebx,256
  230.     sub    ebx,eax
  231.  
  232.     mov    al,[esi+1]
  233.     and    eax,0ffH
  234.     cmp    eax,128
  235.     jb    smp04
  236.     mov    edx,eax
  237.     mov    eax,128
  238.     sub    eax,edx
  239. smp04:    add    eax,128
  240.     mul    byte ptr cs:[edi][ebx]
  241.     add    ecx,eax
  242.  
  243.     mov    al,[esi+2]
  244.     and    eax,0ffH
  245.     cmp    eax,128
  246.     jb    smp05
  247.     mov    edx,eax
  248.     mov    eax,128
  249.     sub    eax,edx
  250. smp05:    add    eax,128
  251.     mul    byte ptr cs:[edi][ebx+256]
  252.     sub    ecx,eax
  253.     sub    ecx,128*256
  254.     sar    ecx,8
  255.     mov    eax,ecx
  256.  
  257. smp06:    pop    edi
  258.     pop    esi
  259.     pop    edx
  260.     pop    ecx
  261.     pop    ebx
  262.     ret    
  263.  
  264. smptb db 255,255,255,254,254,253,253,252
  265.     db    252,251,251,250,249,249,248,248
  266.     db    247,246,246,245,244,244,243,243
  267.     db    242,241,240,240,239,238,238,237
  268.     db    236,236,235,234,233,233,232,231
  269.     db    230,229,229,228,227,226,225,225
  270.     db    224,223,222,221,221,220,219,218
  271.     db    217,216,215,214,214,213,212,211
  272.     db    210,209,208,207,206,205,204,204
  273.     db    203,202,201,200,199,198,197,196
  274.     db    195,194,193,192,191,190,189,188
  275.     db    187,186,185,184,183,182,181,180
  276.     db    179,178,177,176,175,174,172,171
  277.     db    170,169,168,167,166,165,164,163
  278.     db    162,161,160,158,157,156,155,154
  279.     db    153,152,151,150,148,147,146,145
  280.     db    144,143,142,141,139,138,137,136
  281.     db    135,134,133,132,130,129,128,127
  282.     db    126,125,123,122,121,120,119,118
  283.     db    117,115,114,113,112,111,110,108
  284.     db    107,106,105,104,103,101,100,099
  285.     db    098,097,096,094,093,092,091,090
  286.     db    089,087,086,085,084,083,082,080
  287.     db    079,078,077,076,075,073,072,071
  288.     db    070,069,068,067,065,064,063,062
  289.     db    061,060,058,057,056,055,054,053
  290.     db    052,051,049,048,047,046,045,044
  291.     db    043,042,040,039,038,037,036,035
  292.     db    034,033,032,030,029,028,027,026
  293.     db    025,024,023,022,021,020,019,018
  294.     db    016,015,014,013,012,011,010,009
  295.     db    008,007,006,005,004,003,002,001
  296.  
  297.     db    000,000,001,001,001,002,002,002
  298.     db    003,003,003,003,004,004,004,005
  299.     db    005,005,005,006,006,006,006,007
  300.     db    007,007,007,008,008,008,008,009
  301.     db    009,009,009,009,010,010,010,010
  302.     db    010,011,011,011,011,011,011,012
  303.     db    012,012,012,012,012,013,013,013
  304.     db    013,013,013,013,014,014,014,014
  305.     db    014,014,014,014,014,015,015,015
  306.     db    015,015,015,015,015,015,015,015
  307.     db    015,016,016,016,016,016,016,016
  308.     db    016,016,016,016,016,016,016,016
  309.     db    016,016,016,016,016,016,016,016
  310.     db    016,016,016,016,016,016,016,016
  311.     db    016,016,016,016,016,016,016,016
  312.     db    016,016,016,016,016,016,016,016
  313.     db    016,016,016,016,016,016,016,016
  314.     db    016,016,015,015,015,015,015,015
  315.     db    015,015,015,015,015,015,015,015
  316.     db    014,014,014,014,014,014,014,014
  317.     db    014,014,014,013,013,013,013,013
  318.     db    013,013,013,013,012,012,012,012
  319.     db    012,012,012,012,012,011,011,011
  320.     db    011,011,011,011,011,010,010,010
  321.     db    010,010,010,010,009,009,009,009
  322.     db    009,009,009,008,008,008,008,008
  323.     db    008,008,007,007,007,007,007,007
  324.     db    007,006,006,006,006,006,006,005
  325.     db    005,005,005,005,005,004,004,004
  326.     db    004,004,004,003,003,003,003,003
  327.     db    003,002,002,002,002,002,002,001
  328.     db    001,001,001,001,001,000,000,000
  329.  
  330. ;    SIN
  331. ;input    eax = angle ( rate 10000H = 3.14/2 )
  332. ;output    eax = sin ( eax ) * 10000H
  333.  
  334. sin:    push    ebx
  335.     push    ecx
  336.     push    edx
  337.     mov    edx,eax
  338.     and    edx,30000H
  339.     cmp    edx,10000H
  340.     je    sin01
  341.     cmp    edx,30000H
  342.     je    sin01
  343.     jmp    sin02
  344. sin01:    mov    bx,ax
  345.     mov    ax,0ffffH
  346.     sub    ax,bx
  347. sin02:    and    eax,0ffffH
  348.     call    sin03
  349. sin03:    pop    ecx
  350.     add    ecx,sintb-sin03
  351.     push    eax
  352.     shr    eax,8
  353.     mov    bx,cs:[ecx][eax*2]
  354.     mov    cx,cs:[ecx+2][eax*2]
  355.     and    ebx,0ffffH
  356.     and    ecx,0ffffH
  357.     sub    ecx,ebx
  358.     pop    eax
  359.     and    eax,0ffH
  360.     imul    eax,ecx
  361.     shr    eax,8
  362.     add    eax,ebx
  363.     cmp    edx,20000H
  364.     jb    sin04
  365.     mov    ebx,eax
  366.     xor    eax,eax
  367.     sub    eax,ebx
  368. sin04:    pop    edx
  369.     pop    ecx
  370.     pop    ebx
  371.     ret
  372.  
  373. sintb dw 00000H,00192H,00324H,004B6H,00648H,007DAH,0096CH,00AFDH
  374.     dw    00C8FH,00E21H,00FB2H,01143H,012D5H,01465H,015F6H,01787H
  375.     dw    01917H,01AA7H,01C37H,01DC6H,01F56H,020E5H,02273H,02402H
  376.     dw    0250FH,0271DH,028AAH,02A37H,02BC3H,02D4FH,02EDBH,03066H
  377.     dw    031F1H,0337BH,03505H,0368EH,03816H,0399EH,03B26H,03CADH
  378.     dw    03E33H,03FB9H,0413EH,042C3H,04447H,045CAH,0474CH,048CEH
  379.     dw    04A4FH,04BD0H,04D4FH,04ECEH,0504DH,051CAH,05347H,054C3H
  380.     dw    0563EH,057B8H,05931H,05AAAH,05C21H,05D98H,05F0EH,06083H
  381.     dw    061F7H,0636AH,064DCH,0664DH,067BDH,0692CH,06A9AH,06C07H
  382.     dw    06D73H,06EDEH,07048H,071B1H,07319H,0747FH,075E5H,07749H
  383.     dw    078ACH,07A0FH,07B64H,07CCFH,07E2EH,07F8DH,080E7H,08242H
  384.     dw    0839BH,084F3H,0864AH,087A0H,088F5H,08A48H,08B99H,08CEAH
  385.     dw    08E39H,08F86H,090D3H,0921EH,09367H,094AFH,095F6H,0973BH
  386.     dw    0987FH,099C1H,09B02H,09C41H,09D7FH,09EBBH,09FF6H,0A12FH
  387.     dw    0A266H,0A39CH,0A4D1H,0A604H,0A735H,0A865H,0A993H,0AABFH
  388.     dw    0ABEAH,0AD13H,0AE3BH,0AF60H,0B085H,0B1A7H,0B2C8H,0B3E6H
  389.     dw    0B504H,0B61FH,0B739H,0B851H,0B967H,0BA7BH,0BB8EH,0BC9FH
  390.     dw    0BDAEH,0BEBBH,0BFC6H,0C0D0H,0C1D7H,0C2DDH,0C3E1H,0C4E3H
  391.     dw    0C5E3H,0C6E1H,0C7DDH,0C8D7H,0C9D0H,0CAC6H,0CBBBH,0CCADH
  392.     dw    0CD9EH,0CE8CH,0CF79H,0D063H,0D14CH,0D232H,0D317H,0D3F9H
  393.     dw    0D4DAH,0D5B8H,0D695H,0D76FH,0D847H,0D91DH,0D9F1H,0DAC3H
  394.     dw    0DB93H,0DC60H,0DD2CH,0DDF5H,0DEBDH,0DF82H,0E045H,0E106H
  395.     dw    0E1C4H,0E281H,0E33BH,0E3F3H,0E4A9H,0E55DH,0E60EH,0E6BDH
  396.     dw    0E76AH,0E815H,0E8BEH,0E964H,0EA08H,0EAAAH,0EB4AH,0EBE7H
  397.     dw    0EC82H,0ED1BH,0EDB1H,0EE45H,0EED7H,0EF67H,0EFF4H,0F07FH
  398.     dw    0F108H,0F18EH,0F212H,0F293H,0F313H,0F390H,0F40AH,0F483H
  399.     dw    0F4F9H,0F56CH,0F5DDH,0F64CH,0F6B9H,0F723H,0F78AH,0F7F0H
  400.     dw    0F852H,0F8B3H,0F911H,0F96DH,0F9C6H,0FA1DH,0FA72H,0FAC4H
  401.     dw    0FB13H,0FB60H,0FBABH,0FBF4H,0FC3AH,0FC7DH,0FCBEH,0FCFDH
  402.     dw    0FD39H,0FD73H,0FDAAH,0FDDFH,0FE12H,0FE42H,0FE6FH,0FE9AH
  403.     dw    0FEC3H,0FEE9H,0FF0DH,0FF2EH,0FF2EH,0FF4DH,0FF83H,0FF9BH
  404.     dw    0FFB0H,0FFC2H,0FFD2H,0FFE0H,0FFEBH,0FFF3H,0FFFAH,0FFFDH
  405.     dw    0FFFFH
  406.  
  407. sndDelay    endp
  408.  
  409. cseg    ends
  410.     end
  411.